package com.dragon.modules.yuegou.service.product;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dragon.common.web.PageRequest;
import com.dragon.modules.yuegou.entity.product.SpuEntity;
import com.dragon.modules.yuegou.enums.product.FilterType;
import com.dragon.modules.yuegou.enums.product.RequestType;
import com.dragon.modules.yuegou.enums.product.SpuPublishStatus;
import com.dragon.modules.yuegou.enums.product.SpuShowModule;
import com.dragon.modules.yuegou.model.product.AttrSkuRef;
import com.dragon.modules.yuegou.model.product.Attribute;
import com.dragon.modules.yuegou.model.product.PosterAppInfo;
import com.dragon.modules.yuegou.model.product.ProductClassify;
import com.dragon.modules.yuegou.model.product.Sku;
import com.dragon.modules.yuegou.model.product.Spu;
import com.dragon.modules.yuegou.query.product.SpuListQuery;
import com.dragon.modules.yuegou.query.product.SpuPackageQuery;
import com.dragon.modules.yuegou.query.product.SpuQuery;

import java.math.BigDecimal;
import java.util.List;

/**
 * 商品信息 服务接口
 *
 * @author pbuilder generated
 * @date 2019-09-29 16:03:08
 * @version 2.0
 */
public interface SpuService extends IService<SpuEntity> {

	void fullMerchantInfo(Spu spu);
	
	/**
	 * 添加/修改商品
	 */
	void saveProduct(Spu spu);

	/**
	 * 集团新增套餐
	 */
	void savePackage(Spu spu);

	/**
	 * 集团编辑套餐
	 */
	void editPackage(Spu spu);

	/**
	 * 集团查询商品列表查询
	 */
	IPage<Spu> search(PageRequest page, RequestType type, SpuQuery query);
	
	public IPage<Spu> groupSpuListsearch(PageRequest page,RequestType type , SpuListQuery query);
	/**
	 * 集团查询套餐列表查询
	 */
	IPage<Spu> searchPackage(PageRequest page, SpuPackageQuery query);

	/**
	 * 优质好货查询
	 */
	IPage<Spu> productSearch(PageRequest page, FilterType filterType, String busdId, String name, String categoryId);

	/**
	 * 商品列表查询"
	 */
	IPage<Spu> searchSpu(PageRequest page, SpuListQuery query);

	/**
	 * 添加/修改商品
	 */
	void saveSpu(Spu spu);

	/**
	 * 查询当个SPU信息
	 */
	Spu getSpu(String spuId);

	/**
	 * 集团查询SPU信息
	 */
	Spu getSpuDetail(String spuId);

	/**
	 * 上/下架商品
	 */
	void outSpu(String spuId, SpuPublishStatus status);
	
	/**
	 * 搜索商品列表
	 */
	List<Spu> getSpuList(SpuQuery query);
	
	/**
	 * 获取商户实物商品列表
	 */
	List<Spu> getMerchantSpuList(SpuQuery query);
	
	/**
	 * 获取平台实物商品列表
	 */
	List<Spu> getPlatformSpuList(SpuQuery query);
	
	/**
	 * 搜索商品列表分页
	 */
	List<Spu> getSpuPageList(PageRequest page,SpuQuery query);

	/**
	 * 根据商品id查询商品属性
	 */
	List<Sku> getAttr(String spuId);

	/**
	 * 修改排序
	 */
	void editSort(String spuId, Integer sort);

	/**
	 * 套餐详情
	 */
	Spu packageDetail(String packageId);

	/**
	 * 优质好货商品详情
	 */
	Spu productDetail(String spuId);

	/**
	 * 查询商品列表
	 */
	List<Spu> spuList(String name, String busdId);
	
	/**
	 * 查询商品列表
	 */
	IPage<Spu> spuListBroa(PageRequest page, String name, String busdId, SpuShowModule showModule);

	/**
	 * 设置 spu-sku-attribute 规格的公共方法
	 * 
	 * @param spu
	 * @param skuList
	 * @param refList
	 * @return
	 */
	void setAttriButeList(Spu spu, List<Sku> skuList, List<AttrSkuRef> refList);

	/**
	 * 设置 sku-attribute 规格的公共方法
	 * 
	 * @param sku
	 * @param refList
	 */
	void setAttriButeListForSku(Sku sku, List<AttrSkuRef> refList);

	/**
	 * 设置 spu-attribute 规格的公共方法
	 * 
	 * @param refList
	 * @return
	 */
	List<Attribute> attributeList(List<AttrSkuRef> refList);

	String getSpuPosters(String spuId, String appid, PosterAppInfo appinfo, String memberId);

	String merchantGetSpuPosters(String spuId, String appid, PosterAppInfo info, String merchantId);

	String getAppSpuPosters(String spuId, PosterAppInfo info, String memberId);

	/**
	 * 悦商惠端商户商品管理接口
	 * @param page 页码
	 * @param merchantId  商户id
	 * @param busdId 商圈id
	 * @param spu 包含审核状态和上下架状态，商品名称 、validityDateStr（有效期）
	 * @return   Spu 信息
	 */
	IPage<Spu> searchProductList(PageRequest page, String merchantId, String busdId, Spu spu);

    /**
     * 悦商惠端的商品审核状态
     * @param spuId
     * @return
     */
    Spu spuCheckDetail(String spuId);

	/**
	 * 店铺详情页商品
	 * @param page
	 * @param busdId
	 * @param merchantId
	 * @param spuShowModule
	 * @return
	 */
    List<ProductClassify> getProduct(PageRequest page, String busdId, String merchantId, SpuShowModule spuShowModule);

	/**
	 * 悦商惠端添加商品
	 * @param spu
	 */
	void merchantSaveOrUpdateSpu(Spu spu);

	/**
	 * 设置商户实物时间到时自动下架
	 */
	void expireGoodsProduct();

	/**
	 * 查询奖品商品列表
	 * */
	List<Spu> prizeList(String name);

	/**
	 * 查询注册送礼商品列表
	 * @param title
	 * @param type
	 * @return
	 */
	List<Spu> giftList(String title, Integer type);
	
	/**
	 * 悦商惠APP端修改/添加商品
	 * @param spu
	 */
	void merchantAppSaveOrUpdateSpu(Spu spu);

	/***
	 * 到家热销商品的查询
	 * @param pageInfo
	 * @param btypeId
	 * @param name
	 * @param busdId
	 * @return
	 */
	IPage<Spu> searchHostProductInfo(PageRequest pageInfo, String btypeId, String name,String busdId);

	/**
	 * 商户的商品查询
	 * @param pageInfo
	 * @param merchantId
	 * @return
	 */
	IPage<Spu> searchMerchantProductInfo(PageRequest pageInfo, String merchantId);
	
	/**
	 * 红豆商品查询
	 * @param pageInfo
	 * @param merchantId
	 * @param spuName
	 * @return
	 */
	IPage<Spu> searchRedBeanProductInfo(PageRequest pageInfo, String merchantId,String spuName);

	/**
	 * 查询优质商家前三个到家商品
	 * @param merchantId
	 * @return
	 */
    List<Spu> searchMerchantGoHomeThree(String merchantId);

	/**
	 * 到家推荐商品
	 * @param spuIds
	 * @return
	 */
	List<Spu> productModelList(String busdId,List<String> spuIds);

	/**
	 * 到家商品过期下架
	 */
	void expireGoHomeProduct();

	/**
	 * 查询商户SPU优质好货列表
	 * */
	IPage<Spu> merchantSpuList(PageRequest pageInfo, String merchantId);

	/***
	 * 到店推荐商品
	 * @param busdId
	 * @return
	 */
	List<Spu> productModelListGoods(String busdId);

	/**
	 * @param busdId 商圈Id
	 * @param publishStatus 上下架状态
	 * @param type 商品类型
	 * @param merchantId 商户Id
	 * @param showModel 展示模块：13-运营活动(不为13时其余情况都是优质好货)
	 * @return
	 */
	List<Spu> selectSpuList(String busdId, Integer publishStatus, Integer type, String merchantId,Integer showModel);

	/**
	 * 计算会员价格
	 * @param busdId
	 * @param memberId
	 * @param spuId
	 * @param price
	 * @return
	 */
	BigDecimal memberPrice(String busdId, String memberId, String spuId,BigDecimal price);

	/**
	 * 添加总库存
	 * @param spuId
	 * @param addNum
	 */
	void chagngeTotal(String spuId, Integer addNum);
}